Enable CodeGen for member expressions based on call expressions returning aggregate types. This enables expressions like 'foo().member.submember'.

llvm-svn: 45395
This commit is contained in:
Christopher Lamb 2007-12-29 05:02:41 +00:00
parent fd9af54ad1
commit d91c3d4926
3 changed files with 33 additions and 0 deletions

View File

@ -87,6 +87,7 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
return LValue::MakeAddr(llvm::UndefValue::get(Ty));
}
case Expr::CallExprClass: return EmitCallExprLValue(cast<CallExpr>(E));
case Expr::DeclRefExprClass: return EmitDeclRefLValue(cast<DeclRefExpr>(E));
case Expr::ParenExprClass:return EmitLValue(cast<ParenExpr>(E)->getSubExpr());
case Expr::PreDefinedExprClass:
@ -455,6 +456,12 @@ RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
return EmitCallExpr(Callee, E);
}
LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E) {
// Can only get l-value for call expression returning aggregate type
RValue RV = EmitCallExpr(E);
return LValue::MakeAddr(RV.getAggregateAddr());
}
RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, const CallExpr *E) {
// The callee type will always be a pointer to function type, get the function
// type.

View File

@ -371,6 +371,9 @@ public:
/// is 'Ty'.
void EmitStoreThroughLValue(RValue Src, LValue Dst, QualType Ty);
void EmitStoreThroughOCUComponentLValue(RValue Src, LValue Dst, QualType Ty);
// Note: only availabe for agg return types
LValue EmitCallExprLValue(const CallExpr *E);
LValue EmitDeclRefLValue(const DeclRefExpr *E);
LValue EmitStringLiteralLValue(const StringLiteral *E);

View File

@ -0,0 +1,23 @@
// RUN: clang -emit-llvm < %s 2>&1 | not grep 'cannot codegen this l-value expression yet'
struct frk { float _Complex c; int x; };
struct faz { struct frk f; };
struct fuz { struct faz f; };
extern struct fuz foo(void);
int X;
struct frk F;
float _Complex C;
void bar(void) {
X = foo().f.f.x;
}
void bun(void) {
F = foo().f.f;
}
void ban(void) {
C = foo().f.f.c;
}