From: Anders Carlsson Date: Sun, 26 Apr 2009 00:34:20 +0000 (+0000) Subject: When calling the cleanup function specified by __attribute__((cleanup)), make sure... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cabec03f5d1aa3bb7b5c99867c5e75f38452afab;p=clang When calling the cleanup function specified by __attribute__((cleanup)), make sure to bitcast the argument so it has the same type as the first argument of the cleanup function. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70098 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 0a1d1d0bd1..15f1e1d431 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -405,11 +405,22 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) { CleanupScope scope(*this); + const CGFunctionInfo &Info = CGM.getTypes().getFunctionInfo(FD); + + // In some cases, the type of the function argument will be different from + // the type of the pointer. An example of this is + // void f(void* arg); + // __attribute__((cleanup(f))) void *g; + // + // To fix this we insert a bitcast here. + QualType ArgTy = Info.arg_begin()->type; + DeclPtr = Builder.CreateBitCast(DeclPtr, ConvertType(ArgTy)); + CallArgList Args; Args.push_back(std::make_pair(RValue::get(DeclPtr), getContext().getPointerType(D.getType()))); - - EmitCall(CGM.getTypes().getFunctionInfo(FD), F, Args); + + EmitCall(Info, F, Args); } if (needsDispose && CGM.getLangOptions().getGCMode() != LangOptions::GCOnly) { diff --git a/test/CodeGen/attr-cleanup.c b/test/CodeGen/attr-cleanup.c new file mode 100644 index 0000000000..03dde3341e --- /dev/null +++ b/test/CodeGen/attr-cleanup.c @@ -0,0 +1,8 @@ +// RUN: clang-cc -emit-llvm %s -o %t + +// +void f(void* arg); +void g() { + __attribute__((cleanup(f))) void *g; +} +