[clang] [clang][ExprConst] Add diagnostics for invalid binary arithmetic (PR #118475)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 4 07:06:27 PST 2024
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/118475 at github.com>
================
@@ -14548,8 +14548,21 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
return Error(E);
const Expr *LHSExpr = LHSValue.Base.dyn_cast<const Expr *>();
const Expr *RHSExpr = RHSValue.Base.dyn_cast<const Expr *>();
- if (!LHSExpr || !RHSExpr)
- return Error(E);
+ if (!LHSExpr || !RHSExpr) {
+ std::string LHS = LHSValue.toString(Info.Ctx, E->getLHS()->getType());
+ std::string RHS = RHSValue.toString(Info.Ctx, E->getRHS()->getType());
+ Info.FFDiag(E, diag::note_constexpr_pointer_arith_unspecified)
+ << LHS << RHS;
+ return false;
+ }
+
+ if (ArePotentiallyOverlappingStringLiterals(Info, LHSValue, RHSValue)) {
----------------
tbaederr wrote:
I liked the idea and did it for the arithmetic case, but I'm not sure about the order, i.e. the new note is printed after the backtrace of the first error:
```console
./array.cpp:70:8: error: call to consteval function 'L::L<bx>' is not a constant expression
70 | q(0, [] {
| ^
./array.cpp:57:6: note: arithmetic on addresses of potentially overlapping literals has unspecified value
57 | am - aj.af();
| ^
./array.cpp:62:5: note: in call to 'al(&""[0], {&""[0]})'
62 | al(bp.af(), k);
| ^~~~~~~~~~~~~~
./array.cpp:70:8: note: in call to 'L<bx>({})'
70 | q(0, [] {
| ^~~~
71 | struct bx {
| ~~~~~~~~~~~
72 | constexpr operator ab<g<l<decltype(""[0])>::e>::e>() { return t(""); }
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | };
| ~~
74 | return bx();
| ~~~~~~~~~~~~
75 | }());
| ~~~
./array.cpp:72:71: note: repeated evaluation of the same literal expression can produce different objects
72 | constexpr operator ab<g<l<decltype(""[0])>::e>::e>() { return t(""); }
| ^~
```
https://github.com/llvm/llvm-project/pull/118475
More information about the cfe-commits
mailing list