For setting attributes, don't assume there are ParamVarDecls available,
because trying to access non-existent ParamVarDecls can crash. Testcase from the original source for PR2414. llvm-svn: 51960
This commit is contained in:
parent
7bd6e58ddc
commit
2425cd8158
|
@ -206,19 +206,23 @@ void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
|
|||
ParamAttrList.push_back(
|
||||
llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet));
|
||||
unsigned increment = AggregateReturn ? 2 : 1;
|
||||
for (unsigned i = 0; i < FD->getNumParams(); i++) {
|
||||
QualType ParamType = FD->getParamDecl(i)->getType();
|
||||
unsigned ParamAttrs = 0;
|
||||
if (ParamType->isRecordType())
|
||||
ParamAttrs |= llvm::ParamAttr::ByVal;
|
||||
if (ParamType->isSignedIntegerType() && ParamType->isPromotableIntegerType())
|
||||
ParamAttrs |= llvm::ParamAttr::SExt;
|
||||
if (ParamType->isUnsignedIntegerType() && ParamType->isPromotableIntegerType())
|
||||
ParamAttrs |= llvm::ParamAttr::ZExt;
|
||||
if (ParamAttrs)
|
||||
ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment,
|
||||
ParamAttrs));
|
||||
const FunctionTypeProto* FTP = dyn_cast<FunctionTypeProto>(FD->getType());
|
||||
if (FTP) {
|
||||
for (unsigned i = 0; i < FTP->getNumArgs(); i++) {
|
||||
QualType ParamType = FTP->getArgType(i);
|
||||
unsigned ParamAttrs = 0;
|
||||
if (ParamType->isRecordType())
|
||||
ParamAttrs |= llvm::ParamAttr::ByVal;
|
||||
if (ParamType->isSignedIntegerType() && ParamType->isPromotableIntegerType())
|
||||
ParamAttrs |= llvm::ParamAttr::SExt;
|
||||
if (ParamType->isUnsignedIntegerType() && ParamType->isPromotableIntegerType())
|
||||
ParamAttrs |= llvm::ParamAttr::ZExt;
|
||||
if (ParamAttrs)
|
||||
ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment,
|
||||
ParamAttrs));
|
||||
}
|
||||
}
|
||||
|
||||
F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(),
|
||||
ParamAttrList.size()));
|
||||
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
// RUN: clang -emit-llvm < %s
|
||||
|
||||
// PR2414
|
||||
typedef void filter_func_t();
|
||||
struct mad_frame{};
|
||||
enum mad_flow {};
|
||||
|
||||
typedef enum mad_flow filter_func_t(void *, struct mad_frame *);
|
||||
|
||||
filter_func_t mono_filter;
|
||||
|
||||
void addfilter2(filter_func_t *func){}
|
||||
|
||||
void setup_filters()
|
||||
{
|
||||
addfilter2( mono_filter);
|
||||
addfilter2( mono_filter);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue