[clang] 80737d2 - [clang][Interp][NFC] Pass PrimType to visitZeroInitializer()

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 14 09:43:23 PDT 2023


Author: Timm Bäder
Date: 2023-10-14T18:43:00+02:00
New Revision: 80737d2ddf05507d96cdd723fb33a6e44ac72a48

URL: https://github.com/llvm/llvm-project/commit/80737d2ddf05507d96cdd723fb33a6e44ac72a48
DIFF: https://github.com/llvm/llvm-project/commit/80737d2ddf05507d96cdd723fb33a6e44ac72a48.diff

LOG: [clang][Interp][NFC] Pass PrimType to visitZeroInitializer()

This fixes an old FIXME comment. Almost all callers already classify()
the type anyway, so just pass the result of that
to visitZeroInitializer().

Added: 
    

Modified: 
    clang/lib/AST/Interp/ByteCodeExprGen.cpp
    clang/lib/AST/Interp/ByteCodeExprGen.h

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 71aac8c6245c5af..bda9cf1500804f7 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -493,8 +493,8 @@ template <class Emitter>
 bool ByteCodeExprGen<Emitter>::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
   QualType QT = E->getType();
 
-  if (classify(QT))
-    return this->visitZeroInitializer(QT, E);
+  if (std::optional<PrimType> T = classify(QT))
+    return this->visitZeroInitializer(*T, QT, E);
 
   if (QT->isRecordType())
     return false;
@@ -510,7 +510,7 @@ bool ByteCodeExprGen<Emitter>::VisitImplicitValueInitExpr(const ImplicitValueIni
       //   since we memset our Block*s to 0 and so we have the desired value
       //   without this.
       for (size_t I = 0; I != NumElems; ++I) {
-        if (!this->visitZeroInitializer(CAT->getElementType(), E))
+        if (!this->visitZeroInitializer(*ElemT, CAT->getElementType(), E))
           return false;
         if (!this->emitInitElem(*ElemT, I, E))
           return false;
@@ -620,7 +620,7 @@ bool ByteCodeExprGen<Emitter>::VisitInitListExpr(const InitListExpr *E) {
   if (std::optional<PrimType> T = classify(E->getType())) {
     assert(!DiscardResult);
     if (E->getNumInits() == 0)
-      return this->visitZeroInitializer(E->getType(), E);
+      return this->visitZeroInitializer(*T, E->getType(), E);
     assert(E->getNumInits() == 1);
     return this->delegate(E->inits()[0]);
   }
@@ -1560,7 +1560,8 @@ bool ByteCodeExprGen<Emitter>::VisitOffsetOfExpr(const OffsetOfExpr *E) {
 template <class Emitter>
 bool ByteCodeExprGen<Emitter>::VisitCXXScalarValueInitExpr(
     const CXXScalarValueInitExpr *E) {
-  return this->visitZeroInitializer(E->getType(), E);
+  return this->visitZeroInitializer(classifyPrim(E->getType()), E->getType(),
+                                    E);
 }
 
 template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
@@ -1648,12 +1649,8 @@ bool ByteCodeExprGen<Emitter>::visitBool(const Expr *E) {
 }
 
 template <class Emitter>
-bool ByteCodeExprGen<Emitter>::visitZeroInitializer(QualType QT,
+bool ByteCodeExprGen<Emitter>::visitZeroInitializer(PrimType T, QualType QT,
                                                     const Expr *E) {
-  // FIXME: We need the QualType to get the float semantics, but that means we
-  //   classify it over and over again in array situations.
-  PrimType T = classifyPrim(QT);
-
   switch (T) {
   case PT_Bool:
     return this->emitZeroBool(E);
@@ -1699,7 +1696,7 @@ bool ByteCodeExprGen<Emitter>::visitZeroRecordInitializer(const Record *R,
     if (D->isPrimitive()) {
       QualType QT = D->getType();
       PrimType T = classifyPrim(D->getType());
-      if (!this->visitZeroInitializer(QT, E))
+      if (!this->visitZeroInitializer(T, QT, E))
         return false;
       if (!this->emitInitField(T, Field.Offset, E))
         return false;
@@ -1716,7 +1713,7 @@ bool ByteCodeExprGen<Emitter>::visitZeroRecordInitializer(const Record *R,
       QualType ET = D->getElemQualType();
       PrimType T = classifyPrim(ET);
       for (uint32_t I = 0, N = D->getNumElems(); I != N; ++I) {
-        if (!this->visitZeroInitializer(ET, E))
+        if (!this->visitZeroInitializer(T, ET, E))
           return false;
         if (!this->emitInitElem(T, I, E))
           return false;

diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h
index 7cfe4d9251c5f05..2049dab140eaaae 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.h
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.h
@@ -222,7 +222,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
   friend class SourceLocScope<Emitter>;
 
   /// Emits a zero initializer.
-  bool visitZeroInitializer(QualType QT, const Expr *E);
+  bool visitZeroInitializer(PrimType T, QualType QT, const Expr *E);
   bool visitZeroRecordInitializer(const Record *R, const Expr *E);
 
   enum class DerefKind {


        


More information about the cfe-commits mailing list