forked from OSchip/llvm-project
Fix fallout from r219557
Summary: Consider the following nifty 1 liner: (0 ? csqrtl(2.0f) : sqrtl(2.0f)). One can easily obtain such code from e.g. tgmath. Right now it produces an assertion because we fail to do the promotion real => _Complex real. The case was properly handled previously (old handleOtherComplexFloatConversion routine), but was forgotten in the current version. This seems to be about fallout from r219557 Reviewers: chandlerc, rsmith Reviewed By: rsmith Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D6217 llvm-svn: 221821
This commit is contained in:
parent
0788d49a40
commit
0140aa8756
|
@ -5709,7 +5709,7 @@ QualType Sema::CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS,
|
|||
RHS.get()->getType()->isVectorType())
|
||||
return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false);
|
||||
|
||||
UsualArithmeticConversions(LHS, RHS);
|
||||
QualType ResTy = UsualArithmeticConversions(LHS, RHS);
|
||||
if (LHS.isInvalid() || RHS.isInvalid())
|
||||
return QualType();
|
||||
|
||||
|
@ -5726,8 +5726,12 @@ QualType Sema::CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS,
|
|||
|
||||
// If both operands have arithmetic type, do the usual arithmetic conversions
|
||||
// to find a common type: C99 6.5.15p3,5.
|
||||
if (LHSTy->isArithmeticType() && RHSTy->isArithmeticType())
|
||||
return LHS.get()->getType();
|
||||
if (LHSTy->isArithmeticType() && RHSTy->isArithmeticType()) {
|
||||
LHS = ImpCastExprToType(LHS.get(), ResTy, PrepareScalarCast(LHS, ResTy));
|
||||
RHS = ImpCastExprToType(RHS.get(), ResTy, PrepareScalarCast(RHS, ResTy));
|
||||
|
||||
return ResTy;
|
||||
}
|
||||
|
||||
// If both operands are the same structure or union type, the result is that
|
||||
// type.
|
||||
|
|
|
@ -4561,10 +4561,14 @@ QualType Sema::CXXCheckConditionalOperands(ExprResult &Cond, ExprResult &LHS,
|
|||
// the usual arithmetic conversions are performed to bring them to a
|
||||
// common type, and the result is of that type.
|
||||
if (LTy->isArithmeticType() && RTy->isArithmeticType()) {
|
||||
UsualArithmeticConversions(LHS, RHS);
|
||||
QualType ResTy = UsualArithmeticConversions(LHS, RHS);
|
||||
if (LHS.isInvalid() || RHS.isInvalid())
|
||||
return QualType();
|
||||
return LHS.get()->getType();
|
||||
|
||||
LHS = ImpCastExprToType(LHS.get(), ResTy, PrepareScalarCast(LHS, ResTy));
|
||||
RHS = ImpCastExprToType(RHS.get(), ResTy, PrepareScalarCast(RHS, ResTy));
|
||||
|
||||
return ResTy;
|
||||
}
|
||||
|
||||
// -- The second and third operands have pointer type, or one has pointer
|
||||
|
|
|
@ -98,3 +98,12 @@ void t8() {
|
|||
|
||||
const _Complex double test9const = 0;
|
||||
_Complex double test9func() { return test9const; }
|
||||
|
||||
// D6217
|
||||
void t9() {
|
||||
// Check for proper type promotion of conditional expression
|
||||
char c[(int)(sizeof(typeof((0 ? 2.0f : (_Complex double) 2.0f))) - sizeof(_Complex double))];
|
||||
// Check for proper codegen
|
||||
(0 ? 2.0f : (_Complex double) 2.0f);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue