[clang] 030ea6d - [clang][Interp] Only check toplevel declarations
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 2 02:50:59 PDT 2024
Author: Timm Bäder
Date: 2024-07-02T11:50:41+02:00
New Revision: 030ea6d38b7c6afc191bc721be9d59e89bbf7631
URL: https://github.com/llvm/llvm-project/commit/030ea6d38b7c6afc191bc721be9d59e89bbf7631
DIFF: https://github.com/llvm/llvm-project/commit/030ea6d38b7c6afc191bc721be9d59e89bbf7631.diff
LOG: [clang][Interp] Only check toplevel declarations
Added:
Modified:
clang/lib/AST/Interp/Compiler.cpp
clang/lib/AST/Interp/Compiler.h
clang/test/AST/Interp/c.c
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp
index 5ae36dae6557d..77c7e20632881 100644
--- a/clang/lib/AST/Interp/Compiler.cpp
+++ b/clang/lib/AST/Interp/Compiler.cpp
@@ -3460,7 +3460,7 @@ bool Compiler<Emitter>::visitDecl(const VarDecl *VD, bool ConstantContext) {
}
// Create and initialize the variable.
- if (!this->visitVarDecl(VD))
+ if (!this->visitVarDecl(VD, /*Toplevel=*/true))
return false;
// Get a pointer to the variable
@@ -3507,7 +3507,7 @@ bool Compiler<Emitter>::visitDecl(const VarDecl *VD, bool ConstantContext) {
}
template <class Emitter>
-VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD) {
+VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD, bool Toplevel) {
// We don't know what to do with these, so just return false.
if (VD->getType().isNull())
return false;
@@ -3521,7 +3521,7 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD) {
std::optional<PrimType> VarT = classify(VD->getType());
auto checkDecl = [&]() -> bool {
- bool NeedsOp = VD->isLocalVarDecl() && VD->isStaticLocal();
+ bool NeedsOp = !Toplevel && VD->isLocalVarDecl() && VD->isStaticLocal();
return !NeedsOp || this->emitCheckDecl(VD, VD);
};
@@ -4991,7 +4991,7 @@ bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
if ((VD->hasGlobalStorage() || VD->isLocalVarDecl() ||
VD->isStaticDataMember()) &&
typeShouldBeVisited(VD->getType())) {
- auto VarState = this->visitVarDecl(VD);
+ auto VarState = this->visitVarDecl(VD, true);
if (VarState.notCreated())
return true;
if (!VarState)
@@ -5004,7 +5004,7 @@ bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
if (const auto *VD = dyn_cast<VarDecl>(D);
VD && VD->getAnyInitializer() &&
VD->getType().isConstant(Ctx.getASTContext()) && !VD->isWeak()) {
- auto VarState = this->visitVarDecl(VD);
+ auto VarState = this->visitVarDecl(VD, true);
if (VarState.notCreated())
return true;
if (!VarState)
diff --git a/clang/lib/AST/Interp/Compiler.h b/clang/lib/AST/Interp/Compiler.h
index d188ce2200664..67bd7efb3b091 100644
--- a/clang/lib/AST/Interp/Compiler.h
+++ b/clang/lib/AST/Interp/Compiler.h
@@ -260,7 +260,7 @@ class Compiler : public ConstStmtVisitor<Compiler<Emitter>, bool>,
/// intact.
bool delegate(const Expr *E);
/// Creates and initializes a variable from the given decl.
- VarCreationState visitVarDecl(const VarDecl *VD);
+ VarCreationState visitVarDecl(const VarDecl *VD, bool Toplevel = false);
/// Visit an APValue.
bool visitAPValue(const APValue &Val, PrimType ValType, const Expr *E);
bool visitAPValueInitializer(const APValue &Val, const Expr *E);
diff --git a/clang/test/AST/Interp/c.c b/clang/test/AST/Interp/c.c
index 684658da26a0e..9ec305d59c68c 100644
--- a/clang/test/AST/Interp/c.c
+++ b/clang/test/AST/Interp/c.c
@@ -293,3 +293,11 @@ void SuperSpecialFunc(void) {
const int SuperSpecialCase = 10;
_Static_assert((sizeof(SuperSpecialCase) == 12 && SuperSpecialCase == 3) || SuperSpecialCase == 10, ""); // pedantic-warning {{GNU extension}}
}
+
+
+void T1(void) {
+ static int *y[1] = {({ static int _x = 20; (void*)0;})}; // all-error {{initializer element is not a compile-time constant}} \
+ // pedantic-warning {{use of GNU statement expression extension}}
+}
+
+
More information about the cfe-commits
mailing list