Skip to content

Commit 190b917

Browse files
authored
[clang][Interp] Handle SizeOfPackExprs (#71929)
1 parent 688664f commit 190b917

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,11 @@ bool ByteCodeExprGen<Emitter>::VisitCXXScalarValueInitExpr(
16241624
return this->visitZeroInitializer(classifyPrim(Ty), Ty, E);
16251625
}
16261626

1627+
template <class Emitter>
1628+
bool ByteCodeExprGen<Emitter>::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
1629+
return this->emitConst(E->getPackLength(), E);
1630+
}
1631+
16271632
template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
16281633
if (E->containsErrors())
16291634
return false;

clang/lib/AST/Interp/ByteCodeExprGen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
107107
bool VisitSourceLocExpr(const SourceLocExpr *E);
108108
bool VisitOffsetOfExpr(const OffsetOfExpr *E);
109109
bool VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
110+
bool VisitSizeOfPackExpr(const SizeOfPackExpr *E);
110111

111112
protected:
112113
bool visitExpr(const Expr *E) override;

clang/test/AST/Interp/functions.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,3 +371,10 @@ namespace Variadic {
371371
constexpr int (*VFP)(...) = variadic_function2;
372372
static_assert(VFP() == 12, "");
373373
}
374+
375+
namespace Packs {
376+
template<typename...T>
377+
constexpr int foo() { return sizeof...(T); }
378+
static_assert(foo<int, char>() == 2, "");
379+
static_assert(foo<>() == 0, "");
380+
}

0 commit comments

Comments
 (0)