Skip to content

Commit f15d799

Browse files
committed
[clang][Interp] Fix variadic operator calls
Operator calls pass their instance member explicitly, so remove it from NumParams when calling a variadic function
1 parent f651f13 commit f15d799

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2842,7 +2842,8 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) {
28422842
return false;
28432843
} else if (Func->isVariadic()) {
28442844
uint32_t VarArgSize = 0;
2845-
unsigned NumParams = Func->getNumWrittenParams();
2845+
unsigned NumParams =
2846+
Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E);
28462847
for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I)
28472848
VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr)));
28482849
if (!this->emitCallVar(Func, VarArgSize, E))

clang/test/AST/Interp/functions.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,3 +555,13 @@ namespace Local {
555555
return t;
556556
}
557557
}
558+
559+
namespace VariadicOperator {
560+
struct Callable {
561+
float& operator()(...);
562+
};
563+
564+
void test_callable(Callable c) {
565+
float &fr = c(10);
566+
}
567+
}

0 commit comments

Comments
 (0)