-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[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, "");
|
cor3ntin
left a comment
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
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
hazohelet
left a comment
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: