From df53e20f2dee4b3b89abe0a9f30ff8758de62ea4 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 16 Feb 2008 23:55:16 +0000 Subject: [PATCH] implement codegen support for aggregates casted to void. llvm-svn: 47226 --- clang/CodeGen/CGExprScalar.cpp | 16 ++++++++++++---- clang/test/CodeGen/compound.c | 7 ++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/clang/CodeGen/CGExprScalar.cpp b/clang/CodeGen/CGExprScalar.cpp index 6db7beed0bd0..2c7763db8f20 100644 --- a/clang/CodeGen/CGExprScalar.cpp +++ b/clang/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/clang/test/CodeGen/compound.c b/clang/test/CodeGen/compound.c index 090956563162..c8afceef7600 100644 --- a/clang/test/CodeGen/compound.c +++ b/clang/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;} +