From: Eli Friedman Date: Tue, 27 May 2008 15:51:49 +0000 (+0000) Subject: A few more cases for aggregate values. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1851249d787f573b9e1312fff8ca4bbcf351f10;p=clang A few more cases for aggregate values. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51596 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp index 30ff9ecbaf..80231ccb80 100644 --- a/lib/CodeGen/CGExprAgg.cpp +++ b/lib/CodeGen/CGExprAgg.cpp @@ -68,6 +68,8 @@ public: void VisitMemberExpr(MemberExpr *ME) { EmitAggLoadOfLValue(ME); } void VisitUnaryDeref(UnaryOperator *E) { EmitAggLoadOfLValue(E); } void VisitStringLiteral(StringLiteral *E) { EmitAggLoadOfLValue(E); } + void VisitCompoundLiteralExpr(CompoundLiteralExpr *E) + { EmitAggLoadOfLValue(E); } void VisitArraySubscriptExpr(ArraySubscriptExpr *E) { EmitAggLoadOfLValue(E); @@ -90,6 +92,7 @@ public: void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { Visit(DAE->getExpr()); } + void VisitVAArgExpr(VAArgExpr *E); void EmitInitializationToLValue(Expr *E, LValue Address); void EmitNullInitializationToLValue(LValue Address, QualType T); @@ -273,6 +276,13 @@ void AggExprEmitter::VisitConditionalOperator(const ConditionalOperator *E) { CGF.EmitBlock(ContBlock); } +void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { + llvm::Value *ArgValue = CGF.EmitLValue(VE->getSubExpr()).getAddress(); + llvm::Value *V = Builder.CreateVAArg(ArgValue, CGF.ConvertType(VE->getType())); + if (DestPtr) + Builder.CreateStore(V, DestPtr); +} + void AggExprEmitter::EmitNonConstInit(InitListExpr *E) { const llvm::PointerType *APType = diff --git a/test/CodeGen/struct.c b/test/CodeGen/struct.c index 1b476f823d..a081ef1313 100644 --- a/test/CodeGen/struct.c +++ b/test/CodeGen/struct.c @@ -145,3 +145,17 @@ struct a14 { short a; int b; } x = {1, 1}; /* flexible array members */ struct a15 {char a; int b[];} c15; int a16(void) {c15.a = 1;} + +/* compound literals */ +void f13() +{ + a13 x; x = (a13){1,2}; +} + +/* va_arg */ +int f14(int i, ...) { + __builtin_va_list l; + __builtin_va_start(l,i); + a13 b = __builtin_va_arg(l, a13); + return b.b; +}