aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-07-13 20:25:53 +0000
committerChris Lattner <sabre@nondot.org>2007-07-13 20:25:53 +0000
commitd07eb3b5b47c22abd0db7b5d0b377c9db0fd7c34 (patch)
tree53e0d8a993b67f1cf90e7e75b38ee3514e7a8a67
parentd0d560a0975c2f8c4a9559e84ec556b6a0baf7df (diff)
implement codegen support for implicit casts.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39831 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--CodeGen/CGExpr.cpp16
-rw-r--r--CodeGen/CodeGenFunction.h2
2 files changed, 11 insertions, 7 deletions
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index fc59ec076b..78818ce75c 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -472,8 +472,10 @@ RValue CodeGenFunction::EmitExpr(const Expr *E) {
return EmitExpr(cast<ParenExpr>(E)->getSubExpr());
case Expr::UnaryOperatorClass:
return EmitUnaryOperator(cast<UnaryOperator>(E));
+ case Expr::ImplicitCastExprClass:
+ return EmitCastExpr(cast<ImplicitCastExpr>(E)->getSubExpr(), E->getType());
case Expr::CastExprClass:
- return EmitCastExpr(cast<CastExpr>(E));
+ return EmitCastExpr(cast<CastExpr>(E)->getSubExpr(), E->getType());
case Expr::CallExprClass:
return EmitCallExpr(cast<CallExpr>(E));
case Expr::BinaryOperatorClass:
@@ -518,16 +520,18 @@ RValue CodeGenFunction::EmitArraySubscriptExprRV(const ArraySubscriptExpr *E) {
return RValue::get(Builder.CreateExtractElement(Base, Idx, "vecext"));
}
-
-RValue CodeGenFunction::EmitCastExpr(const CastExpr *E) {
+// EmitCastExpr - Emit code for an explicit or implicit cast. Implicit casts
+// have to handle a more broad range of conversions than explicit casts, as they
+// handle things like function to ptr-to-function decay etc.
+RValue CodeGenFunction::EmitCastExpr(const Expr *Op, QualType DestTy) {
QualType SrcTy;
- RValue Src = EmitExprWithUsualUnaryConversions(E->getSubExpr(), SrcTy);
+ RValue Src = EmitExprWithUsualUnaryConversions(Op, SrcTy);
// If the destination is void, just evaluate the source.
- if (E->getType()->isVoidType())
+ if (DestTy->isVoidType())
return RValue::getAggregate(0);
- return EmitConversion(Src, SrcTy, E->getType());
+ return EmitConversion(Src, SrcTy, DestTy);
}
RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h
index 7a07f252bb..7479743ec3 100644
--- a/CodeGen/CodeGenFunction.h
+++ b/CodeGen/CodeGenFunction.h
@@ -313,7 +313,7 @@ public:
RValue EmitFloatingLiteral(const FloatingLiteral *E);
RValue EmitCharacterLiteral(const CharacterLiteral *E);
- RValue EmitCastExpr(const CastExpr *E);
+ RValue EmitCastExpr(const Expr *Op, QualType DestTy);
RValue EmitCallExpr(const CallExpr *E);
RValue EmitArraySubscriptExprRV(const ArraySubscriptExpr *E);