diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-16 20:58:07 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-16 20:58:07 +0000 |
commit | 450da9832b31d9b2e90af7708d197e5b9e1af8c8 (patch) | |
tree | cc36508921e59409641ff923d52acf95cf174d9e /lib/Sema/SemaDecl.cpp | |
parent | 9800dadea77ad62450fc37268eb9778be2f86d06 (diff) |
When merging from a function with a prototype to a function without a
prototype, synthesize ParmVarDecls for prototype-less FunctionDecl.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64666 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 3f31a33c80..b194c9e2ec 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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()); |