From d07eb3b5b47c22abd0db7b5d0b377c9db0fd7c34 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 13 Jul 2007 20:25:53 +0000 Subject: [PATCH] implement codegen support for implicit casts. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39831 91177308-0d34-0410-b5e6-96231b3b80d8 --- CodeGen/CGExpr.cpp | 16 ++++++++++------ CodeGen/CodeGenFunction.h | 2 +- 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(E)->getSubExpr()); case Expr::UnaryOperatorClass: return EmitUnaryOperator(cast(E)); + case Expr::ImplicitCastExprClass: + return EmitCastExpr(cast(E)->getSubExpr(), E->getType()); case Expr::CastExprClass: - return EmitCastExpr(cast(E)); + return EmitCastExpr(cast(E)->getSubExpr(), E->getType()); case Expr::CallExprClass: return EmitCallExpr(cast(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); -- 2.50.1