Skip to content

Commit 075adfd

Browse files
tbaederrAlexisPerry
authored andcommitted
[clang][Interp] Implement CXXStdInitializerListExprs
1 parent fc4456c commit 075adfd

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2930,6 +2930,39 @@ bool ByteCodeExprGen<Emitter>::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {
29302930
return this->delegate(E->getSubExpr());
29312931
}
29322932

2933+
template <class Emitter>
2934+
bool ByteCodeExprGen<Emitter>::VisitCXXStdInitializerListExpr(
2935+
const CXXStdInitializerListExpr *E) {
2936+
const Expr *SubExpr = E->getSubExpr();
2937+
const ConstantArrayType *ArrayType =
2938+
Ctx.getASTContext().getAsConstantArrayType(SubExpr->getType());
2939+
const Record *R = getRecord(E->getType());
2940+
assert(Initializing);
2941+
assert(SubExpr->isGLValue());
2942+
2943+
if (!this->visit(SubExpr))
2944+
return false;
2945+
if (!this->emitInitFieldPtr(R->getField(0u)->Offset, E))
2946+
return false;
2947+
2948+
PrimType SecondFieldT = classifyPrim(R->getField(1u)->Decl->getType());
2949+
if (isIntegralType(SecondFieldT)) {
2950+
if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()),
2951+
SecondFieldT, E))
2952+
return false;
2953+
return this->emitInitField(SecondFieldT, R->getField(1u)->Offset, E);
2954+
}
2955+
assert(SecondFieldT == PT_Ptr);
2956+
2957+
if (!this->emitGetFieldPtr(R->getField(0u)->Offset, E))
2958+
return false;
2959+
if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()), PT_Uint64, E))
2960+
return false;
2961+
if (!this->emitArrayElemPtrPop(PT_Uint64, E))
2962+
return false;
2963+
return this->emitInitFieldPtr(R->getField(1u)->Offset, E);
2964+
}
2965+
29332966
template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
29342967
OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true,
29352968
/*NewInitializing=*/false);

clang/lib/AST/Interp/ByteCodeExprGen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
177177
bool VisitShuffleVectorExpr(const ShuffleVectorExpr *E);
178178
bool VisitExtVectorElementExpr(const ExtVectorElementExpr *E);
179179
bool VisitObjCBoxedExpr(const ObjCBoxedExpr *E);
180+
bool VisitCXXStdInitializerListExpr(const CXXStdInitializerListExpr *E);
180181

181182
protected:
182183
bool visitExpr(const Expr *E) override;

clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2+
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter
23
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -DUNION_TEST -verify %s
34

45
#ifdef UNION_TEST

0 commit comments

Comments
 (0)