When merging from a function with a prototype to a function without a

prototype, synthesize ParmVarDecls for prototype-less FunctionDecl.

llvm-svn: 64666
This commit is contained in:
Douglas Gregor 2009-02-16 20:58:07 +00:00
parent 227811afca
commit bfdd607372
2 changed files with 28 additions and 5 deletions

View File

@ -607,6 +607,23 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, Decl *OldD) {
OldProto->getTypeQuals());
New->setType(NewQType);
New->setInheritedPrototype();
// Synthesize a parameter for each argument type.
llvm::SmallVector<ParmVarDecl*, 16> Params;
for (FunctionTypeProto::arg_type_iterator
ParamType = OldProto->arg_type_begin(),
ParamEnd = OldProto->arg_type_end();
ParamType != ParamEnd; ++ParamType) {
ParmVarDecl *Param = ParmVarDecl::Create(Context, New,
SourceLocation(), 0,
*ParamType, VarDecl::None,
0);
Param->setImplicit();
Params.push_back(Param);
}
New->setParams(Context, &Params[0], Params.size());
}
MergeAttributes(New, Old);
@ -762,7 +779,9 @@ bool Sema::CheckParmsForFunctionDef(FunctionDecl *FD) {
// C99 6.9.1p5: If the declarator includes a parameter type list, the
// declaration of each parameter shall include an identifier.
if (Param->getIdentifier() == 0 && !getLangOptions().CPlusPlus)
if (Param->getIdentifier() == 0 &&
!Param->isImplicit() &&
!getLangOptions().CPlusPlus)
Diag(Param->getLocation(), diag::err_parameter_name_omitted);
}
@ -1693,10 +1712,12 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
llvm::SmallVector<ParmVarDecl*, 16> Params;
for (FunctionTypeProto::arg_type_iterator ArgType = FT->arg_type_begin();
ArgType != FT->arg_type_end(); ++ArgType) {
Params.push_back(ParmVarDecl::Create(Context, DC,
SourceLocation(), 0,
*ArgType, VarDecl::None,
0));
ParmVarDecl *Param = ParmVarDecl::Create(Context, DC,
SourceLocation(), 0,
*ArgType, VarDecl::None,
0);
Param->setImplicit();
Params.push_back(Param);
}
NewFD->setParams(Context, &Params[0], Params.size());

View File

@ -15,3 +15,5 @@ void test3(T f) {
f();
}
int a(int);
int a() {return 1;}