[clang] 2cd19df - [clang][Interp] Allow visiting extern variables
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 14 07:39:48 PDT 2024
Author: Timm Bäder
Date: 2024-03-14T15:39:28+01:00
New Revision: 2cd19df792056bbac38ed64c028e335d0c7ef05d
URL: https://github.com/llvm/llvm-project/commit/2cd19df792056bbac38ed64c028e335d0c7ef05d
DIFF: https://github.com/llvm/llvm-project/commit/2cd19df792056bbac38ed64c028e335d0c7ef05d.diff
LOG: [clang][Interp] Allow visiting extern variables
If the variable is additionally const(expr), visit them like normal
but omit the initializer.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/literals.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 33d50d7c2b4f2b..25f4e1ead7e3c9 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -2665,18 +2665,12 @@ bool ByteCodeExprGen<Emitter>::visitVarDecl(const VarDecl *VD) {
if (P.getGlobal(VD))
return true;
- // Ignore external declarations. We will instead emit a dummy
- // pointer when we see a DeclRefExpr for them.
- if (VD->hasExternalStorage())
- return true;
-
std::optional<unsigned> GlobalIndex = P.createGlobal(VD, Init);
if (!GlobalIndex)
return false;
- assert(Init);
- {
+ if (Init) {
DeclScope<Emitter> LocalScope(this, VD);
if (VarT) {
@@ -2686,6 +2680,7 @@ bool ByteCodeExprGen<Emitter>::visitVarDecl(const VarDecl *VD) {
}
return this->visitGlobalInitializer(Init, *GlobalIndex);
}
+ return true;
} else {
VariableScope<Emitter> LocalScope(this);
if (VarT) {
diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp
index 2b1001dbd3baee..0a9580b6f664b0 100644
--- a/clang/test/AST/Interp/literals.cpp
+++ b/clang/test/AST/Interp/literals.cpp
@@ -1190,6 +1190,11 @@ namespace incdecbool {
constexpr int externvar1() { // both-error {{never produces a constant expression}}
extern char arr[]; // ref-note {{declared here}}
return arr[0]; // ref-note {{read of non-constexpr variable 'arr'}} \
- // expected-note {{indexing of array without known bound}}
+ // expected-note {{array-to-pointer decay of array member without known bound is not supported}}
}
#endif
+
+namespace Extern {
+ constexpr extern char Oops = 1;
+ static_assert(Oops == 1, "");
+}
More information about the cfe-commits
mailing list