]> granicus.if.org Git - clang/commitdiff
add support for codegen of calls returning complex.
authorChris Lattner <sabre@nondot.org>
Thu, 23 Aug 2007 21:38:16 +0000 (21:38 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 23 Aug 2007 21:38:16 +0000 (21:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41336 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGComplexExpr.cpp

index e5abf686ded1a62393c0dadfdb638d8e40afc21f..90bb078b77c92fb9877b6c6ee2d6a7dc71e98481 100644 (file)
@@ -74,10 +74,9 @@ public:
   ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
   ComplexPairTy VisitMemberExpr(Expr *E) { return EmitLoadOfLValue(E); }
 
-  // FIXME: Call
   // FIXME: CompoundLiteralExpr
   // FIXME: ImplicitCastExpr
-  // FIXME: CastExpr
+  ComplexPairTy VisitCallExpr(const CallExpr *E);
   
   // Operators.
   ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
@@ -107,7 +106,7 @@ public:
   
   ComplexPairTy VisitBinMul        (const BinaryOperator *E);
   ComplexPairTy VisitBinAdd        (const BinaryOperator *E);
-  // FIXME: div/rem
+  // FIXME: sub/div/rem
   // GCC rejects and/or/xor for integer complex.
   // Logical and/or always return int, never complex.
 
@@ -170,6 +169,11 @@ ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
   return ComplexPairTy(U, U);
 }
 
+ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
+  llvm::Value *AggPtr = CGF.EmitCallExpr(E).getAggregateAddr();
+  return EmitLoadOfComplex(AggPtr, false);
+}
+
 ComplexPairTy ComplexExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
                                                      bool isInc, bool isPre) {
   LValue LV = CGF.EmitLValue(E->getSubExpr());