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 | d764625448caf3b885b37be6bfa88f93f16cbb3c (patch) | |
| tree | 2b9c0721eb6616f64567cddfd829eff93609f298 /clang/lib/AST | |
| parent | 2536851543ed3fd4ac60631488a2f7df61829669 (diff) | |
| download | bcm5719-llvm-d764625448caf3b885b37be6bfa88f93f16cbb3c.tar.gz bcm5719-llvm-d764625448caf3b885b37be6bfa88f93f16cbb3c.zip | |
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.
llvm-svn: 119036
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 9 |
2 files changed, 20 insertions, 3 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index cc209a458a1..d5bdc88ccfe 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -800,14 +800,24 @@ const char *CastExpr::getCastKindName() const { return "ObjCObjectLValueCast"; case CK_FloatingRealToComplex: return "FloatingRealToComplex"; + case CK_FloatingComplexToReal: + return "FloatingComplexToReal"; + case CK_FloatingComplexToBoolean: + return "FloatingComplexToBoolean"; case CK_FloatingComplexCast: return "FloatingComplexCast"; + case CK_FloatingComplexToIntegralComplex: + return "FloatingComplexToIntegralComplex"; case CK_IntegralRealToComplex: return "IntegralRealToComplex"; + case CK_IntegralComplexToReal: + return "IntegralComplexToReal"; + case CK_IntegralComplexToBoolean: + return "IntegralComplexToBoolean"; case CK_IntegralComplexCast: return "IntegralComplexCast"; - case CK_IntegralToFloatingComplex: - return "IntegralToFloatingComplex"; + case CK_IntegralComplexToFloatingComplex: + return "IntegralComplexToFloatingComplex"; } llvm_unreachable("Unhandled cast kind!"); diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 172a811bee1..8a6d4ba7c42 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2073,7 +2073,14 @@ bool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { Result, Info.Ctx); return true; } - // FIXME: Handle complex types + + if (E->getCastKind() == CK_FloatingComplexToReal) { + ComplexValue V; + if (!EvaluateComplex(SubExpr, V, Info)) + return false; + Result = V.getComplexFloatReal(); + return true; + } return false; } |

