[clang] afba3da - [clang][Interp] Add basic support for AddrLabelExprs
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Wed May 15 01:52:03 PDT 2024
Author: Timm Bäder
Date: 2024-05-15T10:17:10+02:00
New Revision: afba3daf822c839db1be40464041307679c803a9
URL: https://github.com/llvm/llvm-project/commit/afba3daf822c839db1be40464041307679c803a9
DIFF: https://github.com/llvm/llvm-project/commit/afba3daf822c839db1be40464041307679c803a9.diff
LOG: [clang][Interp] Add basic support for AddrLabelExprs
Just create a local variable for them.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/lib/AST/Interp/ByteCodeExprGen.h
clang/test/AST/Interp/c.c
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 7b10482dff23f..1da74ac7c8bd1 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -2488,6 +2488,16 @@ bool ByteCodeExprGen<Emitter>::VisitRecoveryExpr(const RecoveryExpr *E) {
return this->emitError(E);
}
+template <class Emitter>
+bool ByteCodeExprGen<Emitter>::VisitAddrLabelExpr(const AddrLabelExpr *E) {
+ assert(E->getType()->isVoidPointerType());
+
+ unsigned Offset = allocateLocalPrimitive(
+ E->getLabel(), PT_Ptr, /*IsConst=*/true, /*IsExtended=*/false);
+
+ return this->emitGetLocal(PT_Ptr, Offset, E);
+}
+
template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true,
/*NewInitializing=*/false);
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h
index 9f83d173bbae3..6039a54d32a5b 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.h
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.h
@@ -122,6 +122,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
bool VisitPseudoObjectExpr(const PseudoObjectExpr *E);
bool VisitPackIndexingExpr(const PackIndexingExpr *E);
bool VisitRecoveryExpr(const RecoveryExpr *E);
+ bool VisitAddrLabelExpr(const AddrLabelExpr *E);
protected:
bool visitExpr(const Expr *E) override;
diff --git a/clang/test/AST/Interp/c.c b/clang/test/AST/Interp/c.c
index 2c675f4418ef3..2a75457a4693f 100644
--- a/clang/test/AST/Interp/c.c
+++ b/clang/test/AST/Interp/c.c
@@ -273,3 +273,8 @@ int test3(void) {
/// This tests that we have full type info, even for values we cannot read.
int dummyarray[5];
_Static_assert(&dummyarray[0] < &dummyarray[1], ""); // pedantic-warning {{GNU extension}}
+
+void addrlabelexpr(void) {
+ a0: ;
+ static void *ps[] = { &&a0 }; // pedantic-warning {{use of GNU address-of-label extension}}
+}
More information about the cfe-commits
mailing list