[clang][Interp] Fix _Complex comma operators
Handle them before shelling out to visitComplexBinOp().
This commit is contained in:
parent
0c21377aea
commit
d56110fa02
@ -401,6 +401,17 @@ bool ByteCodeExprGen<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) {
|
||||
const Expr *LHS = BO->getLHS();
|
||||
const Expr *RHS = BO->getRHS();
|
||||
|
||||
// Handle comma operators. Just discard the LHS
|
||||
// and delegate to RHS.
|
||||
if (BO->isCommaOp()) {
|
||||
if (!this->discard(LHS))
|
||||
return false;
|
||||
if (RHS->getType()->isVoidType())
|
||||
return this->discard(RHS);
|
||||
|
||||
return this->delegate(RHS);
|
||||
}
|
||||
|
||||
if (BO->getType()->isAnyComplexType())
|
||||
return this->VisitComplexBinOp(BO);
|
||||
if ((LHS->getType()->isAnyComplexType() ||
|
||||
@ -416,16 +427,6 @@ bool ByteCodeExprGen<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) {
|
||||
std::optional<PrimType> RT = classify(RHS->getType());
|
||||
std::optional<PrimType> T = classify(BO->getType());
|
||||
|
||||
// Deal with operations which have composite or void types.
|
||||
if (BO->isCommaOp()) {
|
||||
if (!this->discard(LHS))
|
||||
return false;
|
||||
if (RHS->getType()->isVoidType())
|
||||
return this->discard(RHS);
|
||||
|
||||
return this->delegate(RHS);
|
||||
}
|
||||
|
||||
// Special case for C++'s three-way/spaceship operator <=>, which
|
||||
// returns a std::{strong,weak,partial}_ordering (which is a class, so doesn't
|
||||
// have a PrimType).
|
||||
|
||||
@ -9,6 +9,9 @@ static_assert(&__imag z1 == &__real z1 + 1, "");
|
||||
static_assert((*(&__imag z1)) == __imag z1, "");
|
||||
static_assert((*(&__real z1)) == __real z1, "");
|
||||
|
||||
constexpr _Complex int Comma1 = {1, 2};
|
||||
constexpr _Complex int Comma2 = (0, Comma1);
|
||||
static_assert(Comma1 == Comma1, "");
|
||||
|
||||
constexpr double setter() {
|
||||
_Complex float d = {1.0, 2.0};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user