diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 4c24216888525cd..ae409d889cb0aa9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -379,6 +379,25 @@ Improvements to Clang's diagnostics can sometimes lead to worse ordering. +- When describing a warning/error in a function-style type conversion Clang underlines only until + the end of the expression we convert from. Now Clang underlines until the closing parenthesis. + + Before: + + .. code-block:: text + + warning: cast from 'long (*)(const int &)' to 'decltype(fun_ptr)' (aka 'long (*)(int &)') converts to incompatible function type [-Wcast-function-type-strict] + 24 | return decltype(fun_ptr)( f_ptr /*comment*/); + | ^~~~~~~~~~~~~~~~~~~~~~~~ + + After: + + .. code-block:: text + + warning: cast from 'long (*)(const int &)' to 'decltype(fun_ptr)' (aka 'long (*)(int &)') converts to incompatible function type [-Wcast-function-type-strict] + 24 | return decltype(fun_ptr)( f_ptr /*comment*/); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Bug Fixes in This Version ------------------------- - Fixed an issue where a class template specialization whose declaration is diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp index 98b5879456e2175..87e6d1a2198fcea 100644 --- a/clang/lib/Sema/SemaCast.cpp +++ b/clang/lib/Sema/SemaCast.cpp @@ -3362,7 +3362,7 @@ ExprResult Sema::BuildCXXFunctionalCastExpr(TypeSourceInfo *CastTypeInfo, assert(LPLoc.isValid() && "List-initialization shouldn't get here."); CastOperation Op(*this, Type, CastExpr); Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange(); - Op.OpRange = SourceRange(Op.DestRange.getBegin(), CastExpr->getEndLoc()); + Op.OpRange = SourceRange(Op.DestRange.getBegin(), RPLoc); Op.CheckCXXCStyleCast(/*FunctionalCast=*/true, /*ListInit=*/false); if (Op.SrcExpr.isInvalid()) diff --git a/clang/test/Misc/misc-source-ranges.cpp b/clang/test/Misc/misc-source-ranges.cpp index 7a9d9d057dac407..1835952fd755902 100644 --- a/clang/test/Misc/misc-source-ranges.cpp +++ b/clang/test/Misc/misc-source-ranges.cpp @@ -1,7 +1,13 @@ -// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info -Wcast-function-type-strict %s 2>&1 | FileCheck %s struct S { char a : 12 - 12; }; // CHECK: misc-source-ranges.cpp:[[@LINE-2]]:8:{[[@LINE-2]]:12-[[@LINE-2]]:19} +using fun = long(*)(int &); +fun foo(){ + long (*f_ptr)(const int &); + return fun(f_ptr); +} +// CHECK: misc-source-ranges.cpp:[[@LINE-2]]:10:{[[@LINE-2]]:10-[[@LINE-2]]:20}