diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2008-05-27 15:51:49 +0000 | 
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2008-05-27 15:51:49 +0000 | 
| commit | 21911e89d55da3a47eb02fceb85dbd5c5294bc11 (patch) | |
| tree | 93463007a02bae9304875776bc5b4d4d8a03af80 /clang | |
| parent | 5e2281ede8364dd7d2af7c9a0e4dd15ad6653fdd (diff) | |
| download | bcm5719-llvm-21911e89d55da3a47eb02fceb85dbd5c5294bc11.tar.gz bcm5719-llvm-21911e89d55da3a47eb02fceb85dbd5c5294bc11.zip  | |
A few more cases for aggregate values.
llvm-svn: 51596
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGExprAgg.cpp | 10 | ||||
| -rw-r--r-- | clang/test/CodeGen/struct.c | 14 | 
2 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 30ff9ecbaf3..80231ccb807 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/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/clang/test/CodeGen/struct.c b/clang/test/CodeGen/struct.c index 1b476f823d5..a081ef13132 100644 --- a/clang/test/CodeGen/struct.c +++ b/clang/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; +}  | 

