[clang] 54826d4 - [clang][Interp] Emit dummy pointers for unknown static locals
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 15 09:12:59 PST 2024
Author: Timm Bäder
Date: 2024-02-15T18:12:47+01:00
New Revision: 54826d4980db5782dac2d7326c29ad60cd017e56
URL: https://github.com/llvm/llvm-project/commit/54826d4980db5782dac2d7326c29ad60cd017e56
DIFF: https://github.com/llvm/llvm-project/commit/54826d4980db5782dac2d7326c29ad60cd017e56.diff
LOG: [clang][Interp] Emit dummy pointers for unknown static locals
We used to emit dummy pointers for unknown declarations in certain
cases in C, but this is also necessary in C++.
I'm limiting this to static local variables for now.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/functions.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 25208f7dafbcd6..db6d818eef334b 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3239,9 +3239,14 @@ bool ByteCodeExprGen<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) {
return this->emitGetPtrThisField(Offset, E);
}
- // Lazily visit global declarations we haven't seen yet.
- // This happens in C.
- if (!Ctx.getLangOpts().CPlusPlus) {
+ // Try to lazily visit (or emit dummy pointers for) declarations
+ // we haven't seen yet.
+ if (Ctx.getLangOpts().CPlusPlus) {
+ if (const auto *VD = dyn_cast<VarDecl>(D); VD && VD->isStaticLocal()) {
+ if (std::optional<unsigned> I = P.getOrCreateDummy(D))
+ return this->emitGetPtrGlobal(*I, E);
+ }
+ } else {
if (const auto *VD = dyn_cast<VarDecl>(D);
VD && VD->getAnyInitializer() && VD->getType().isConstQualified()) {
if (!this->visitVarDecl(VD))
diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp
index 320691336bdd99..bf582362460ebc 100644
--- a/clang/test/AST/Interp/functions.cpp
+++ b/clang/test/AST/Interp/functions.cpp
@@ -523,3 +523,23 @@ namespace Move {
constexpr int A = std::move(5);
static_assert(A == 5, "");
}
+
+namespace StaticLocals {
+ void test() {
+ static int j; // both-note {{declared here}}
+ static_assert(&j != nullptr, ""); // both-warning {{always true}}
+
+ static_assert(j == 0, ""); // both-error {{not an integral constant expression}} \
+ // both-note {{read of non-const variable 'j'}}
+
+ static int k = 0; // both-note {{declared here}}
+ static_assert(k == 0, ""); // both-error {{not an integral constant expression}} \
+ // both-note {{read of non-const variable 'k'}}
+
+ static const int l = 12;
+ static_assert(l == 12, "");
+
+ static const int m; // both-error {{default initialization}}
+ static_assert(m == 0, "");
+ }
+}
More information about the cfe-commits
mailing list