[clang] [clang][bytecode] Check diagnosing() before calling diagnoseUnknownDecl() (PR #224906)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 20 03:42:38 PDT 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/224906
We can save some small preparations this way, e.g. calling `getRootVarDecl()`.
>From f0f2a53b052e60fb77d7a134070ac8cb4263c84e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Sun, 20 Sep 2026 12:14:04 +0200
Subject: [PATCH] checkdummy
---
clang/lib/AST/ByteCode/Interp.cpp | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 49ebcc789b7dd..7afed0e05c886 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -129,9 +129,8 @@ static void diagnoseNonConstVariable(InterpState &S, CodePtr OpPC,
static bool diagnoseUnknownDecl(InterpState &S, CodePtr OpPC,
const ValueDecl *D, AccessKinds AK = AK_Read) {
// This function tries pretty hard to produce a good diagnostic. Just skip
- // that if nobody will see it anyway.
- if (!S.diagnosing())
- return false;
+ // that if nobody will see it anyway. This should be handled in the caller.
+ assert(S.diagnosing());
if (isa<ParmVarDecl>(D)) {
if (D->getType()->isReferenceType()) {
@@ -1346,6 +1345,9 @@ bool CheckDeleteSource(InterpState &S, CodePtr OpPC, const Expr *Source,
/// We aleady know the given DeclRefExpr is invalid for some reason,
/// now figure out why and print appropriate diagnostics.
bool CheckDeclRef(InterpState &S, CodePtr OpPC, const DeclRefExpr *DR) {
+ if (!S.diagnosing())
+ return false;
+
const ValueDecl *D = DR->getDecl();
return diagnoseUnknownDecl(S, OpPC, D);
}
@@ -1370,12 +1372,15 @@ bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
if (!Ptr.isDummy())
return true;
- const VarDecl *D = Ptr.getRootVarDecl();
- if (!D)
+ if (!S.diagnosing())
return false;
- if (AK == AK_Read || AK == AK_Increment || AK == AK_Decrement)
+ if (AK == AK_Read || AK == AK_Increment || AK == AK_Decrement) {
+ const VarDecl *D = Ptr.getRootVarDecl();
+ if (!D)
+ return false;
return diagnoseUnknownDecl(S, OpPC, D, AK);
+ }
if (AK == AK_Destroy || S.getLangOpts().CPlusPlus14)
S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_modify_global);
More information about the cfe-commits
mailing list