[clang][Interp] Classify ArrayInitIndexExpr type
authorTimm Bäder <tbaeder@redhat.com>
Fri, 14 Oct 2022 09:08:57 +0000 (11:08 +0200)
committerTimm Bäder <tbaeder@redhat.com>
Fri, 14 Oct 2022 09:10:28 +0000 (11:10 +0200)
We can't just push a uint64 unconditionally here, since on 32bit arches
we later expect a different type, e.g. uint32.

This broke e.g. these builders:
https://lab.llvm.org/buildbot#builders/171/builds/21514
https://lab.llvm.org/buildbot#builders/38/builds/6643

clang/lib/AST/Interp/ByteCodeExprGen.cpp

index b9e7f4e..5af97eb 100644 (file)
@@ -330,7 +330,9 @@ template <class Emitter>
 bool ByteCodeExprGen<Emitter>::VisitArrayInitIndexExpr(
     const ArrayInitIndexExpr *E) {
   assert(ArrayIndex);
-  return this->emitConstUint64(*ArrayIndex, E);
+  QualType IndexType = E->getType();
+  APInt Value(getIntWidth(IndexType), *ArrayIndex);
+  return this->emitConst(classifyPrim(IndexType), 0, Value, E);
 }
 
 template <class Emitter>