Author: Timm Bäder
Date: 2022-10-21T10:49:45+02:00
New Revision: 09bbc903a5b454d39d5ce69cf8bf6d5e1b46e3c4

URL: 
https://github.com/llvm/llvm-project/commit/09bbc903a5b454d39d5ce69cf8bf6d5e1b46e3c4
DIFF: 
https://github.com/llvm/llvm-project/commit/09bbc903a5b454d39d5ce69cf8bf6d5e1b46e3c4.diff

LOG: [clang][Interp] Array initialization via ImplicitValueInitExpr

Differential Revision: https://reviews.llvm.org/D135013

Added: 
    

Modified: 
    clang/lib/AST/Interp/ByteCodeExprGen.cpp
    clang/test/AST/Interp/arrays.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp 
b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index ad3348cee4e2f..872bbf045cef2 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -721,6 +721,27 @@ bool ByteCodeExprGen<Emitter>::visitArrayInitializer(const 
Expr *Initializer) {
       if (!this->emitPopPtr(Initializer))
         return false;
     }
+    return true;
+  } else if (const auto *IVIE = dyn_cast<ImplicitValueInitExpr>(Initializer)) {
+    const ArrayType *AT = IVIE->getType()->getAsArrayTypeUnsafe();
+    assert(AT);
+    const auto *CAT = cast<ConstantArrayType>(AT);
+    size_t NumElems = CAT->getSize().getZExtValue();
+
+    if (Optional<PrimType> ElemT = classify(CAT->getElementType())) {
+      // TODO(perf): For int and bool types, we can probably just skip this
+      //   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->emitZero(*ElemT, Initializer))
+          return false;
+        if (!this->emitInitElem(*ElemT, I, Initializer))
+          return false;
+      }
+    } else {
+      assert(false && "default initializer for non-primitive type");
+    }
+
     return true;
   }
 

diff  --git a/clang/test/AST/Interp/arrays.cpp 
b/clang/test/AST/Interp/arrays.cpp
index 318793ff777a0..d41999414f5b6 100644
--- a/clang/test/AST/Interp/arrays.cpp
+++ b/clang/test/AST/Interp/arrays.cpp
@@ -117,3 +117,15 @@ namespace indices {
                                        // expected-error {{must be initialized 
by a constant expression}} \
                                        // expected-note {{cannot refer to 
element -2 of array of 10}}
 };
+
+namespace DefaultInit {
+  template <typename T, unsigned N>
+  struct B {
+    T a[N];
+  };
+
+  int f() {
+     constexpr B<int,10> arr = {};
+     constexpr int x = arr.a[0];
+  }
+};


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to