-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[clang][Diagnostics] Add source range to uninitialized diagnostics #65896
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang ChangesBefore:
After:
-- 3 Files Affected:
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d8632f53bb1eef4..54a8d582939e118 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,7 @@ 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->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..c94b48c8fc614e6 100644 --- a/clang/lib/AST/Interp/Interp.cpp +++ b/clang/lib/AST/Interp/Interp.cpp @@ -261,9 +261,9 @@ 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; + const Expr *E = S.Current->getExpr(OpPC); + S.FFDiag(E, diag::note_constexpr_access_uninit) + << AK << /*uninitialized=*/true << E->getSourceRange(); } return false; } 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, ""); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Meh this breaks a test in |
clang/lib/AST/ExprConstant.cpp
Outdated
@@ -4443,7 +4444,7 @@ 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->getSourceRange(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I prefer E->getLHS()->getSourceRange()
because the uninitialized object is known to exist in LHS.
698f706
to
3d0a747
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
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; | ^~~
…lvm#65896) 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; | ^~~ ```
Before:
After: