Author: Takuya Shimizu Date: 2023-06-26T00:27:15+09:00 New Revision: 409a8097c5c728607eb6b05efb1744bf5f9096e1
URL: https://github.com/llvm/llvm-project/commit/409a8097c5c728607eb6b05efb1744bf5f9096e1 DIFF: https://github.com/llvm/llvm-project/commit/409a8097c5c728607eb6b05efb1744bf5f9096e1.diff LOG: [clang][Diagnostics] Provide parameter source range to arity-mismatch notes Consider the following piece of code: ``` void func( int aa, int bb, int cc) {} void arity_mismatch() { func(2, 4); } ``` BEFORE: ``` source.cpp:6:3: error: no matching function for call to 'func' 6 | func(2, 4); | ^~~~ source.cpp:1:6: note: candidate function not viable: requires 3 arguments, but 2 were provided 1 | void func( int aa, | ^ ``` AFTER: ``` source.cpp:6:3: error: no matching function for call to 'func' 6 | func(2, 4); | ^~~~ source.cpp:1:6: note: candidate function not viable: requires 3 arguments, but 2 were provided 1 | void func( int aa, | ^ ~~~~~~~ 2 | int bb, | ~~~~~~~ 3 | int cc) {} | ~~~~~~ ``` Reviewed By: cjdb, aaron.ballman Differential Revision: https://reviews.llvm.org/D153267 Added: clang/test/Misc/diag-func-call-ranges.c clang/test/Misc/diag-func-call-ranges.cpp Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaOverload.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ff9f8da044db5..43f80bddce3ff 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -364,6 +364,8 @@ Improvements to Clang's diagnostics - The Fix-It emitted for unused labels used to expand to the next line, which caused visual oddities now that Clang shows more than one line of code snippet. This has been fixed and the Fix-It now only spans to the end of the ``:``. +- Clang now underlines the parameter list of function declaration when emitting + a note about the mismatch in the number of arguments. Bug Fixes in This Version ------------------------- diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 45056f0d56075..528b76518ff3a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -6459,7 +6459,8 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, // Emit the location of the prototype. if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig) - Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl; + Diag(FDecl->getLocation(), diag::note_callee_decl) + << FDecl << FDecl->getParametersSourceRange(); return true; } @@ -6504,7 +6505,8 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, // Emit the location of the prototype. if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig) - Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl; + Diag(FDecl->getLocation(), diag::note_callee_decl) + << FDecl << FDecl->getParametersSourceRange(); // This deletes the extra arguments. Call->shrinkNumArgs(NumParams); diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 108e2cf47437a..d4f1c61259c03 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11037,11 +11037,13 @@ static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, if (modeCount == 1 && Fn->getParamDecl(0)->getDeclName()) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second - << Description << mode << Fn->getParamDecl(0) << NumFormalArgs; + << Description << mode << Fn->getParamDecl(0) << NumFormalArgs + << Fn->getParametersSourceRange(); else S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second - << Description << mode << modeCount << NumFormalArgs; + << Description << mode << modeCount << NumFormalArgs + << Fn->getParametersSourceRange(); MaybeEmitInheritedConstructorNote(S, Found); } diff --git a/clang/test/Misc/diag-func-call-ranges.c b/clang/test/Misc/diag-func-call-ranges.c new file mode 100644 index 0000000000000..c1ad687acb146 --- /dev/null +++ b/clang/test/Misc/diag-func-call-ranges.c @@ -0,0 +1,11 @@ +// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s --strict-whitespace + +// CHECK: :{9:3-9:7}: error: too few arguments +// CHECK: :{7:12-7:26}: note: 'func' declared here +// CHECK: :{10:3-10:7}{10:13-10:17}: error: too many arguments +// CHECK: :{7:12-7:26}: note: 'func' declared here +void func( int aa, int bb) {} +void arity_mismatch() { + func(3); + func(3, 4,5, 6); +} diff --git a/clang/test/Misc/diag-func-call-ranges.cpp b/clang/test/Misc/diag-func-call-ranges.cpp new file mode 100644 index 0000000000000..ecdc03b7ef51c --- /dev/null +++ b/clang/test/Misc/diag-func-call-ranges.cpp @@ -0,0 +1,14 @@ +// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s --strict-whitespace + +// CHECK: error: no matching function for call to 'func' + +// CHECK: :{[[@LINE+1]]:12-[[@LINE+1]]:18}: note: {{.*}} requires single argument +void func( int aa ) {} +// CHECK: :{[[@LINE+1]]:12-[[@LINE+3]]:18}: note: {{.*}} requires 3 arguments +void func( int aa, + int bb, + int cc) {} + +void arity_mismatch() { + func(2, 4); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits