From: Daniel Dunbar Date: Tue, 10 Feb 2009 03:03:30 +0000 (+0000) Subject: Support va_arg on _Complex. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e484b8134c7eaeced03be7e4e0f7349def9b355;p=clang Support va_arg on _Complex. gcc compat test suite results (Darwin x86-32 & -64): -- # of expected passes 1110 # of unexpected failures 74 # of unresolved testcases 168 # of unsupported tests 2 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64197 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp index 387635cb06..89a206dfb1 100644 --- a/lib/CodeGen/CGExprComplex.cpp +++ b/lib/CodeGen/CGExprComplex.cpp @@ -192,6 +192,8 @@ public: ComplexPairTy VisitChooseExpr(ChooseExpr *CE); ComplexPairTy VisitInitListExpr(InitListExpr *E); + + ComplexPairTy VisitVAArgExpr(VAArgExpr *E); }; } // end anonymous namespace. @@ -528,6 +530,22 @@ ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) { return ComplexPairTy(zeroConstant, zeroConstant); } +ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) { + llvm::Value *ArgValue = CGF.EmitLValue(E->getSubExpr()).getAddress(); + llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType()); + + if (!ArgPtr) { + CGF.ErrorUnsupported(E, "complex va_arg expression"); + const llvm::Type *EltTy = + CGF.ConvertType(E->getType()->getAsComplexType()->getElementType()); + llvm::Value *U = llvm::UndefValue::get(EltTy); + return ComplexPairTy(U, U); + } + + // FIXME Volatility. + return EmitLoadOfComplex(ArgPtr, false); +} + //===----------------------------------------------------------------------===// // Entry Point into this File //===----------------------------------------------------------------------===// diff --git a/test/Coverage/c-language-features.inc b/test/Coverage/c-language-features.inc index 8b56e6a55b..6a475d6c2f 100644 --- a/test/Coverage/c-language-features.inc +++ b/test/Coverage/c-language-features.inc @@ -103,6 +103,7 @@ void f4(int a0, int a1, int a2, va_list ap) { int t12_0 = __builtin_classify_type(t0); int t12_1 = __builtin_classify_type(t1); int t12_2 = __builtin_classify_type(t2); + // FIXME: Add _Complex and aggregate cases. int t13 = va_arg(ap, int); va_list t13_0; va_copy(t13_0, ap);