From: Chris Lattner Date: Sat, 16 Feb 2008 23:55:16 +0000 (+0000) Subject: implement codegen support for aggregates casted to void. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=19a1d7c646729eb858b15583e647262a22de3637;p=clang 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 --- 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(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;} +