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:
Eli Friedman 2008-06-04 19:41:28 +00:00
parent 7bd6e58ddc
commit 2425cd8158
2 changed files with 22 additions and 15 deletions

View File

@ -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()));

View File

@ -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);
}