Handle function calls that return aggregate expressions.

llvm-svn: 43581
This commit is contained in:
Anders Carlsson 2007-10-31 22:04:46 +00:00
parent d822d68b74
commit 0370eb2034
2 changed files with 28 additions and 1 deletions

View File

@ -67,7 +67,7 @@ public:
// case Expr::UnaryOperatorClass:
// case Expr::ImplicitCastExprClass:
// case Expr::CastExprClass:
// case Expr::CallExprClass:
void VisitCallExpr(const CallExpr *E);
void VisitStmtExpr(const StmtExpr *E);
void VisitBinaryOperator(const BinaryOperator *BO);
void VisitBinAssign(const BinaryOperator *E);
@ -132,6 +132,19 @@ void AggExprEmitter::EmitAggLoadOfLValue(const Expr *E) {
// Visitor Methods
//===----------------------------------------------------------------------===//
void AggExprEmitter::VisitCallExpr(const CallExpr *E)
{
RValue RV = CGF.EmitCallExpr(E);
assert(RV.isAggregate() && "Return value must be aggregate value!");
// If the result is ignored, don't copy from the value.
if (DestPtr == 0)
// FIXME: If the source is volatile, we must read from it.
return;
EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
}
void AggExprEmitter::VisitStmtExpr(const StmtExpr *E) {
CGF.EmitCompoundStmt(*E->getSubStmt(), true, DestPtr, VolatileDest);
}

View File

@ -63,3 +63,17 @@ void f4() {
void f5() {
(f3())->d1 = 42;
}
/* Function calls */
typedef struct {
int location;
int length;
} range;
extern range f6();
void f7()
{
range r = f6();
}