https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/65896:
>From 0bdcbb6d3b6dc7baa91729b1aa76ee4c9069b961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sun, 10 Sep 2023 14:28:02 +0200 Subject: [PATCH] [clang][Diagnostics] Add source range to uninitialized diagnostics Before: array.cpp:319:10: note: read of uninitialized object is not allowed in a constant expression 319 | return aaa; | ^ After: array.cpp:319:10: note: read of uninitialized object is not allowed in a constant expression 319 | return aaa; | ^~~ --- clang/lib/AST/ExprConstant.cpp | 6 ++++-- clang/lib/AST/Interp/Interp.cpp | 5 ++--- clang/lib/AST/Interp/InterpFrame.cpp | 3 +++ clang/test/Misc/constexpr-source-ranges.cpp | 8 ++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d8632f53bb1eef4..dfa48e9c030b6a3 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -3711,7 +3711,8 @@ findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, !isValidIndeterminateAccess(handler.AccessKind))) { if (!Info.checkingPotentialConstantExpression()) Info.FFDiag(E, diag::note_constexpr_access_uninit) - << handler.AccessKind << O->isIndeterminate(); + << handler.AccessKind << O->isIndeterminate() + << E->getSourceRange(); return handler.failed(); } @@ -4443,7 +4444,8 @@ struct CompoundAssignSubobjectHandler { return foundVector(Subobj, SubobjType); case APValue::Indeterminate: Info.FFDiag(E, diag::note_constexpr_access_uninit) - << /*read of=*/0 << /*uninitialized object=*/1; + << /*read of=*/0 << /*uninitialized object=*/1 + << E->getLHS()->getSourceRange(); return false; default: // FIXME: can this happen? diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp index 719a96daaebdd73..de6ab4a145a1422 100644 --- a/clang/lib/AST/Interp/Interp.cpp +++ b/clang/lib/AST/Interp/Interp.cpp @@ -261,9 +261,8 @@ bool CheckInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr, return true; if (!S.checkingPotentialConstantExpression()) { - const SourceInfo &Loc = S.Current->getSource(OpPC); - S.FFDiag(Loc, diag::note_constexpr_access_uninit) - << AK << /*uninitialized=*/true; + S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_access_uninit) + << AK << /*uninitialized=*/true << S.Current->getRange(OpPC); } return false; } diff --git a/clang/lib/AST/Interp/InterpFrame.cpp b/clang/lib/AST/Interp/InterpFrame.cpp index ab3116eccf2017e..49db83a965ab001 100644 --- a/clang/lib/AST/Interp/InterpFrame.cpp +++ b/clang/lib/AST/Interp/InterpFrame.cpp @@ -230,5 +230,8 @@ SourceLocation InterpFrame::getLocation(CodePtr PC) const { } SourceRange InterpFrame::getRange(CodePtr PC) const { + if (Func && Func->getDecl()->isImplicit() && Caller) + return Caller->getRange(RetPC); + return S.getRange(Func, PC); } diff --git a/clang/test/Misc/constexpr-source-ranges.cpp b/clang/test/Misc/constexpr-source-ranges.cpp index f21373eff3a95ca..7f5c522ae305b54 100644 --- a/clang/test/Misc/constexpr-source-ranges.cpp +++ b/clang/test/Misc/constexpr-source-ranges.cpp @@ -41,3 +41,11 @@ int x = -1 + __INT_MAX__ + 2 + 3; // CHECK: :{[[@LINE+1]]:9-[[@LINE+1]]:19}: int a = -(1 << 31) + 1; } + + +constexpr int uninit() { + int aaa; + // CHECK: :{[[@LINE+1]]:10-[[@LINE+1]]:13}: + return aaa; +} +static_assert(uninit() == 0, ""); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits