]> granicus.if.org Git - clang/commitdiff
implement codegen support for implicit casts.
authorChris Lattner <sabre@nondot.org>
Fri, 13 Jul 2007 20:25:53 +0000 (20:25 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Jul 2007 20:25:53 +0000 (20:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39831 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExpr.cpp
CodeGen/CodeGenFunction.h

index fc59ec076b038484d29daffdbd22e26e25a143ed..78818ce75cf061c26f9351258be7331457a10d23 100644 (file)
@@ -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) {
index 7a07f252bb05f8f7626eaa9ffda01f0a81afb390..7479743ec3d8568154a2baa377532d3b27cb9237 100644 (file)
@@ -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);