diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 18 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 29 |
2 files changed, 19 insertions, 28 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index a715531c74a..57a44e54d8b 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -431,10 +431,10 @@ unsigned FunctionDecl::getBuiltinID(ASTContext &Context) const { } -/// getNumParmVarDeclsFromType - Ignoring the actual argument list, this -/// returns the number of ParmVarDecls that the FunctionType of this function -/// expects. -unsigned FunctionDecl::getNumParmVarDeclsFromType() const { +/// getNumParams - Return the number of parameters this function must have +/// based on its functiontype. This is the length of the PararmInfo array +/// after it has been created. +unsigned FunctionDecl::getNumParams() const { const FunctionType *FT = getType()->getAsFunctionType(); if (isa<FunctionNoProtoType>(FT)) return 0; @@ -442,18 +442,10 @@ unsigned FunctionDecl::getNumParmVarDeclsFromType() const { } -unsigned FunctionDecl::getNumParams() const { - // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar; - if (!ParamInfo) - return 0; - - return getNumParmVarDeclsFromType(); -} - void FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, unsigned NumParams) { assert(ParamInfo == 0 && "Already has param info!"); - assert(NumParams == getNumParmVarDeclsFromType() && + assert(NumParams == getNumParams() && "Parameter count mismatch!"); // Zero params -> null pointer. diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index d34b20780e8..8dd43560468 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2153,8 +2153,8 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, } NewFD->setParams(Context, &Params[0], Params.size()); - } else if (isa<TypedefType>(R)) { - // When we're declaring a function with a typedef, as in the + } else if (const FunctionProtoType *FT = R->getAsFunctionProtoType()) { + // When we're declaring a function with a typedef, typeof, etc as in the // following example, we'll need to synthesize (unnamed) // parameters for use in the declaration. // @@ -2162,20 +2162,19 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, // typedef void fn(int); // fn f; // @endcode - if (const FunctionProtoType *FT = R->getAsFunctionProtoType()) { - // Synthesize a parameter for each argument type. - llvm::SmallVector<ParmVarDecl*, 16> Params; - for (FunctionProtoType::arg_type_iterator ArgType = FT->arg_type_begin(); - ArgType != FT->arg_type_end(); ++ArgType) { - 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()); + + // Synthesize a parameter for each argument type. + llvm::SmallVector<ParmVarDecl*, 16> Params; + for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(), + AE = FT->arg_type_end(); AI != AE; ++AI) { + ParmVarDecl *Param = ParmVarDecl::Create(Context, DC, + SourceLocation(), 0, + *AI, VarDecl::None, 0); + Param->setImplicit(); + Params.push_back(Param); } + + NewFD->setParams(Context, &Params[0], Params.size()); } // If name lookup finds a previous declaration that is not in the |

