зеркало из https://github.com/microsoft/clang-1.git
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 <rdar://problem/6827047>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70098 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
2eafc1b563
Коммит
cabec03f5d
|
@ -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) {
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: clang-cc -emit-llvm %s -o %t
|
||||
|
||||
// <rdar://problem/6827047>
|
||||
void f(void* arg);
|
||||
void g() {
|
||||
__attribute__((cleanup(f))) void *g;
|
||||
}
|
||||
|
Загрузка…
Ссылка в новой задаче