diff options
author | Chris Lattner <sabre@nondot.org> | 2008-02-16 23:55:16 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-02-16 23:55:16 +0000 |
commit | 19a1d7c646729eb858b15583e647262a22de3637 (patch) | |
tree | b8a6e9a1f5715a4994fb46b68484c785f0101e26 | |
parent | 7df3d71b2da8aede8ca72f971050b851d1734bf0 (diff) |
implement codegen support for aggregates casted to void.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47226 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | CodeGen/CGExprScalar.cpp | 16 | ||||
-rw-r--r-- | test/CodeGen/compound.c | 7 |
2 files changed, 18 insertions, 5 deletions
diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index 6db7beed0b..2c7763db8f 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -508,16 +508,24 @@ Value *ScalarExprEmitter::VisitImplicitCastExpr(const ImplicitCastExpr *E) { // handle things like function to ptr-to-function decay etc. Value *ScalarExprEmitter::EmitCastExpr(const Expr *E, QualType DestTy) { // Handle cases where the source is an non-complex type. - if (!E->getType()->isComplexType()) { + + if (!CGF.hasAggregateLLVMType(E->getType())) { Value *Src = Visit(const_cast<Expr*>(E)); // Use EmitScalarConversion to perform the conversion. return EmitScalarConversion(Src, E->getType(), DestTy); } + + if (E->getType()->isComplexType()) { + // Handle cases where the source is a complex type. + return EmitComplexToScalarConversion(CGF.EmitComplexExpr(E), E->getType(), + DestTy); + } - // Handle cases where the source is a complex type. - return EmitComplexToScalarConversion(CGF.EmitComplexExpr(E), E->getType(), - DestTy); + // Okay, this is a cast from an aggregate. It must be a cast to void. Just + // evaluate the result and return. + CGF.EmitAggExpr(E, 0, false); + return 0; } Value *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) { diff --git a/test/CodeGen/compound.c b/test/CodeGen/compound.c index 0909565631..c8afceef76 100644 --- a/test/CodeGen/compound.c +++ b/test/CodeGen/compound.c @@ -1,4 +1,4 @@ -// RUN: clang %s -emit-llvm +// RUN: clang < %s -emit-llvm int A; long long B; int C; @@ -18,3 +18,8 @@ void foo(char *strbuf) { int stufflen = 4; strbuf += stufflen; } + + +// Aggregate cast to void +union uu { int a;}; void f(union uu p) { (void) p;} + |