diff options
author | John McCall <rjmccall@apple.com> | 2010-11-14 08:17:51 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-11-14 08:17:51 +0000 |
commit | f3ea8cfe6b1c2ef0702efe130561e9e66708d799 (patch) | |
tree | e846d78ad848b43259d6f6a48698f41e4f29e399 /lib/CodeGen | |
parent | 81921cc4218e07363b5a0ea031fe775cba9b40c6 (diff) |
Add a few more complex-related cast kinds that arise due to arbitrary
implicit conversions; the last batch was specific to promotions.
I think this is the full set we need. I do think dividing the cast
kinds into floating and integral is probably a good idea.
Annotate a *lot* more C casts with useful cast kinds.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 7 | ||||
-rw-r--r-- | lib/CodeGen/CGExprComplex.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 21 |
3 files changed, 27 insertions, 3 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 6739fd679c..3356cf46fb 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1815,10 +1815,15 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) { case CK_FloatingToIntegral: case CK_FloatingCast: case CK_FloatingRealToComplex: + case CK_FloatingComplexToReal: + case CK_FloatingComplexToBoolean: case CK_FloatingComplexCast: + case CK_FloatingComplexToIntegralComplex: case CK_IntegralRealToComplex: + case CK_IntegralComplexToReal: + case CK_IntegralComplexToBoolean: case CK_IntegralComplexCast: - case CK_IntegralToFloatingComplex: + case CK_IntegralComplexToFloatingComplex: case CK_DerivedToBaseMemberPointer: case CK_BaseToDerivedMemberPointer: case CK_MemberPointerToBoolean: diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp index 637441f4e1..ad0786fd9b 100644 --- a/lib/CodeGen/CGExprComplex.cpp +++ b/lib/CodeGen/CGExprComplex.cpp @@ -274,6 +274,8 @@ ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile) { llvm::Value *Real=0, *Imag=0; + // FIXME: we should really not be suppressing volatile loads. + if (!IgnoreReal) { llvm::Value *RealP = Builder.CreateStructGEP(SrcPtr, 0, SrcPtr->getName() + ".realp"); diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 5b419c02f8..8d72e47fb8 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -1083,7 +1083,8 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) { case CK_FloatingComplexCast: case CK_IntegralRealToComplex: case CK_IntegralComplexCast: - case CK_IntegralToFloatingComplex: + case CK_IntegralComplexToFloatingComplex: + case CK_FloatingComplexToIntegralComplex: case CK_ConstructorConversion: assert(0 && "Should be unreachable!"); break; @@ -1151,6 +1152,20 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) { const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>(); return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, MemPtr, MPT); } + + case CK_FloatingComplexToReal: + case CK_IntegralComplexToReal: + return CGF.EmitComplexExpr(E, false, true, false, true).first; + + case CK_FloatingComplexToBoolean: + case CK_IntegralComplexToBoolean: { + CodeGenFunction::ComplexPairTy V + = CGF.EmitComplexExpr(E, false, false, false, false); + + // TODO: kill this function off, inline appropriate case here + return EmitComplexToScalarConversion(V, E->getType(), DestTy); + } + } // Handle cases where the source is an non-complex type. @@ -1162,8 +1177,10 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) { return EmitScalarConversion(Src, E->getType(), DestTy); } + // Handle cases where the source is a complex type. + // TODO: when we're certain about cast kinds, we should just be able + // to assert that no complexes make it here. if (E->getType()->isAnyComplexType()) { - // Handle cases where the source is a complex type. bool IgnoreImag = true; bool IgnoreImagAssign = true; bool IgnoreReal = IgnoreResultAssign; |